elasticsearch与springboot整合 并新增简单数据

您所在的位置:网站首页 elasticsearch7 springboot elasticsearch与springboot整合 并新增简单数据

elasticsearch与springboot整合 并新增简单数据

#elasticsearch与springboot整合 并新增简单数据| 来源: 网络整理| 查看: 265

es7后,type默认就是_doc。所以创建对象定义的时候,不用命名为别的type就行。

一 整合

1、pom.xml 引入elasticsearch相关。

org.springframework.boot spring-boot-starter-data-elasticsearch

junit测试相关

org.springframework.boot spring-boot-starter-test test org.junit.jupiter junit-jupiter-engine org.junit.platform junit-platform-launcher com.alibaba fastjson 1.2.62

 

 

2、application.yml中加入es地址配置。

配置文件

这里中my-elasticsearch为host中的配置es的地址。

spring: data: elasticsearch: cluster-name: mses-cluster cluster-nodes: ms-elasticsearch:9300

 

二、代码创建索引映射相关信息。

1、定义实体:

实体类中声明对应的索引信息

@Document(indexName = "house_vo", type="_doc")

HouseVo.java

package com.ms.cloud.business.bean; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; import java.util.Map; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; import lombok.Data; @Data // 加上这个声明,就自动带get、set方法了 @Document(indexName = "house_vo", type="_doc") public class HouseVo implements Serializable{ // 这个很重要,这个是ID信息,如果不定义,那么会默认生成一个随机字符串为ID, @Id private String pkId; private String title; //标题 @Field(type = FieldType.Text, analyzer = "ik_max_word") private String remark; @Field(type = FieldType.Keyword) private String signMap; private Map signMap2; // 声明为嵌套类型 @Field(type = FieldType.Nested) private List photos; // 不声明类型默认为object private HouseUser user; private BigDecimal price; public HouseVo() { } public HouseVo(String pkId, String title, String remark, List photos, HouseUser user, BigDecimal price) { super(); this.pkId = pkId; this.title = title; this.remark = remark; this.photos = photos; this.user = user; this.price = price; } }

子类 HousePhoto.java

package com.ms.cloud.business.bean; import java.io.Serializable; import java.util.Date; import lombok.Data; @Data public class HousePhoto implements Serializable{ private String id; private String title; //标题 private String remark; private Date upDate; public HousePhoto() {} public HousePhoto(String id, String title, String remark, Date upDate) { super(); this.id = id; this.title = title; this.remark = remark; this.upDate = upDate; } }

 

2、交互操作类 HouseDao

只需要继承extends ElasticsearchRepository 就可以用es的相关增删改查功能,无需繁琐操作。

package com.ms.cloud.business.dao; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import com.ms.cloud.business.bean.HouseVo; public interface HouseDao extends ElasticsearchRepository { }

 

3、测试写入一些数据

这里用的是junit进行操作

package com.ms.cloud; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import lombok.extern.slf4j.Slf4j; @Slf4j @RunWith(SpringRunner.class) @SpringBootTest(classes = ESApp.class) public class BaseTest { private Long starttime; @Rule public TestName junitClass= new TestName(); @Before public void before() { starttime = System.currentTimeMillis(); System.out.println(junitClass.getMethodName() + "....................start...................."); } @After public void after() { double usedtime = (System.currentTimeMillis() - starttime) / 1000.0; System.out.println(junitClass.getMethodName() + "耗时 " + usedtime + " ms"); System.out.println(junitClass.getMethodName() + "....................end...................."); } }

所有需要用的测试类,继承父类即可用测试。

package com.ms.cloud.test; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import com.alibaba.fastjson.JSON; import com.ms.cloud.BaseTest; import com.ms.cloud.business.bean.HousePhoto; import com.ms.cloud.business.bean.HouseUser; import com.ms.cloud.business.bean.HouseVo; import com.ms.cloud.business.dao.HouseDao; public class HouseDaoTests extends BaseTest { @Autowired private HouseDao repository; /** * @desc 插入单条信息 * @date 2020年5月9日 下午2:05:49 */ @Test public void insert() { System.out.println("insert"); HouseUser houseUser = new HouseUser("李无", 25L, new Date()); List photos = new ArrayList(); photos.add(new HousePhoto("p1", "相片01", "五菱最终到es", new Date())); photos.add(new HousePhoto("p2", "相片02", "五菱里面会存储一条数据", new Date())); photos.add(new HousePhoto("p3", "相片03", "五菱在第二种类型里面", new Date())); photos.add(new HousePhoto("p4", "相片04", "五菱而如果声明了car类型是nested", new Date())); HouseVo houseVo = new HouseVo("2000002", "Eclipse中格式化代码快捷键", "eclipse中格式化代码快捷键Ctrl+Shift+F失效,很长一段时间我的eclie都有个毛病,就是当我要格式化代码的时候,右键", photos, houseUser, new BigDecimal("5089.32")); Map signMap = new HashMap(); signMap.put("car", "五菱"); signMap.put("house", "好房"); houseVo.setSignMap2(signMap); repository.save(houseVo); } /** * @desc 批量插入信息 * @date 2020年5月9日 下午2:05:37 */ @Test public void insertBatch() { System.out.println("insertBatch"); HouseUser houseUser = new HouseUser("李有才", 25L, new Date()); List photos = new ArrayList(); photos.add(new HousePhoto("p1", "相片01", "最终到es", new Date())); photos.add(new HousePhoto("p2", "相片02", "里面会存储一条数据", new Date())); photos.add(new HousePhoto("p3", "相片03", "在第二种类型里面", new Date())); photos.add(new HousePhoto("p4", "相片04", "而如果声明了car类型是nested", new Date())); HouseVo houseVo2 = new HouseVo("1000002", "陈说美食的个人频道_腾讯视频", "4天前 - 陈说美食 分享美食制作过程,以及制作技巧1068视频 分享 订阅 1.5万 首页 视频 专辑 最新 最热 腾讯视频 v.qq.com 胖妹做“豪横”版海鲜炒饭,8只大虾", photos, houseUser, new BigDecimal("2000.32")); HouseVo houseVo3 = new HouseVo("1000003", "陈说美食 简介:分享生活中的美食", "和美食制作方法与技巧 订阅 1.5万粉丝数主页 视频 播单 订阅的频道(0) 还没有订阅过频道! 粉丝(1.5万) ios游客用户", photos, houseUser, new BigDecimal("2000.32")); HouseVo houseVo4 = new HouseVo("1000004", "陈说美食 - 知乎", "他的动态 回答了问题1 天前 你在今年的开头悟到了什么? 陈说美食 中国的武汉肺炎 美国的流感 东非的蝗灾 澳洲的山火 ... 今年是个灾年吗?…阅读全文?", photos, houseUser, new BigDecimal("2000.32")); HouseVo houseVo5 = new HouseVo("1000005", "陈说美食_视频在线观看-爱奇艺搜索", "2020年2月13日 - 爱奇艺搜索“陈说美食”搜索结果页面为您提供最新最全的“陈说美食”相关视频的搜索和在线观看服务。", photos, houseUser, new BigDecimal("2000.32")); List houseVos = new ArrayList(); houseVos.add(houseVo2); houseVos.add(houseVo3); houseVos.add(houseVo4); houseVos.add(houseVo5); repository.saveAll(houseVos); } /** * @desc根据ID查询信息 * @date 2020年5月9日 下午2:05:22 */ @Test public void findById() { System.out.println("findById"); Optional optional = repository.findById("1000002"); HouseVo houseVo = optional.get(); System.out.println(JSON.toJSON(optional)); System.out.println(JSON.toJSON(houseVo)); }

/** * @desc根据ID删除信息 * @date 2020年5月9日 下午2:05:22 */ @Test public void deleteById() { repository.deleteById("2000002"); }

}

 

执行完成后,结果如图。

技术分享图片

 

 

 通过kibana连接上es后,可以看到在es中也创建了相应的索引 house_vo

技术分享图片

 

 

 如上,看到有一条数据,5个文档条。点击索引可以看到索引的映射关系,也就类似数据库的ddl数据结构类型定义。

为什么写入一条数据,这里文档是5个,因为类型定义为nested类型的嵌套类型字段,会区分为单独的文档。

技术分享图片

 

查看数据,如下。

技术分享图片

 

 

 

新增,修改都使用的是save方法或者批量的saveall方法。

es会根据id来进行区分,是新增,还是修改。

 

删除有多重方法,可根据索引对象、全删除、范围。。也是根据ID进行删除即可。

技术分享图片

 

elasticsearch与springboot整合 并新增简单数据

原文:https://www.cnblogs.com/a393060727/p/12857219.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3